﻿/*=============================================================================
* File Name : Color4.h                         Ver : 1.00  Date : 2009-4-10
*
* Description :
*
*       カラー構造体　ヘッダ
*
* Author : 土田　悠貴.
*============================================================================*/
#ifndef _COLOR_H_
#define _COLOR_H_

namespace tglib
{

class Vector3;
class Vector4;

/**
 * @brief Color4．
 */
class Color4
{
public:	
	/*===========================================================================*/
	/**
	 * コンストラクタ．
	 */
	Color4();

	/*===========================================================================*/
	/**
	 * コンストラクタ．
	 *
	 * @param [in]  R　レッド値．
	 * @param [in]  G　グリーン値．
	 * @param [in]  B　ブルー値．
	 * @param [in]  A　アルファ値．
	 */
	Color4( float R, float G, float B, float A );

	/*===========================================================================*/
	/**
	 * コンストラクタ．
	 *
	 * @param [in]  v　Vector3(RGBカラー)．
	 */
	Color4( const Vector3& v );

	/*===========================================================================*/
	/**
	 * コンストラクタ．
	 *
	 * @param [in]  v　Vector4(RGBAカラー)．
	 */
	Color4( const Vector4& v );

	/*===========================================================================*/
	/**
	 * コンストラクタ．
	 *
	 * @param [in]  p　配列のポインタ．
	 */
	Color4( const float* p );

	/*===========================================================================*/
	/**
	 * 0.0～1.0に補正する．
	 *
	 * @return 補正したカラー値．
	 */
	Color4& saturate();

	/*===========================================================================*/
	/**
	 * (float*型)キャスト演算子オーバーロード．
	 *
	 * @return   型変換をしたカラー成分．
	 */
	operator float* ();

	/*===========================================================================*/
	/**
	 * (const float*型)キャスト演算子オーバーロード．
	 *
	 * @return   型変換をしたカラー成分．
	 */
	operator const float* ();

	/*===========================================================================*/
	/**
	 * (+)単項演算子オーバーロード．
	 *
	 * @return 結果のColor4．
	 */
	Color4 operator + () const;

	/*===========================================================================*/
	/**
	 * (-)単項演算子オーバーロード．
	 *
	 * @return 結果のColor4.
	 */
	Color4 operator - () const;

	/*===========================================================================*/
	/**
	 * (+=) 演算子オーバーロード．
	 * 
	 * @param [in]  c Color4．
	 * @return 結果のColor4．
	 */
	Color4& operator += ( const Color4& c );

	/*===========================================================================*/
	/**
	 * (-=) 演算子オーバーロード．
	 * 
	 * @param [in]  c Color4．
	 * @return 結果のColor4．
	 */
	Color4& operator -= ( const Color4& c );

	/*===========================================================================*/
	/**
	 * (*=) 演算子オーバーロード．
	 * 
	 * @param [in]  c Color4．
	 * @return 結果のColor4．
	 */
	Color4& operator *= ( const Color4& c );

	/*===========================================================================*/
	/**
	 * (*=) 演算子オーバーロード．
	 * 
	 * @param [in]  s スカラー．
	 * @return 結果のColor4．
	 */
	Color4& operator *= ( float s );

	/*===========================================================================*/
	/**
	 * (/=) 演算子オーバーロード．
	 * 
	 * @param [in]  c Color4．
	 * @return 結果のColor4．
	 */
	Color4& operator /= ( const Color4& c );

	/*===========================================================================*/
	/**
	 * (/=) 演算子オーバーロード．
	 * 
	 * @param [in]  s スカラー．
	 * @return 結果のColor4．
	 */
	Color4& operator /= ( float s );

public:
	union
	{
		struct 
		{
			/* @brief 赤成分 */
			float	r;		

			/* @brief 緑成分 */
			float	g;		

			/* @brief 青成分 */
			float	b;		

			/* @brief アルファ値 */
			float	a;
		};
		float RGBA[4];
	};
};

/***  以下非メンバ関数 *******************************************************/

/*===========================================================================*/
/**
 * (+)演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 結果のColor4．
 */
const Color4 operator + ( const Color4& c1, const Color4& c2 );

/*===========================================================================*/
/**
 * (-)演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 結果のColor4．
 */
const Color4 operator - ( const Color4& c1, const Color4& c2 );

/*===========================================================================*/
/**
 * (*)演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 結果のColor4．
 */
const Color4 operator * ( const Color4& c1, const Color4& c2 ); 

/*===========================================================================*/
/**
 * (*)演算子オーバーロード．
 * 
 * @param [in]  c Color4．
 * @param [in]  s スカラー．
 * @return 結果のColor4．
 */
const Color4 operator * ( const Color4& c, float s );

/*===========================================================================*/
/**
 * (*)演算子オーバーロード．
 * 
 * @param [in]  s スカラー．
 * @param [in]  c Color4．
 * @return 結果のColor4．
 */
const Color4 operator * ( float s, const Color4& c );

/*===========================================================================*/
/**
 * (/)演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 結果のColor4．
 */
const Color4 operator / ( const Color4& c1, const Color4& c2 );

/*===========================================================================*/
/**
 * (/)演算子オーバーロード．
 * 
 * @param [in]  c Color4．
 * @param [in]  s スカラー．
 * @return 結果のColor4．
 */
const Color4 operator / ( const Color4& c, float s );

/*===========================================================================*/
/**
 * (==) 演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 比較結果．
 */
bool operator == ( const Color4& c1, const Color4& c2 );

/*===========================================================================*/
/**
 * (!=) 演算子オーバーロード．
 * 
 * @param [in]  c1 Color4．
 * @param [in]  c2 Color4．
 * @return 比較結果．
 */
bool operator != ( const Color4& c1, const Color4& c2 );

} // namespace tglib

#endif

/*========= End of File =====================================================*/
